//【Day20】LeetCode算法题【1784. 检查二进制字符串字段】【14. 最长公共前缀】




/*【1784. 检查二进制字符串字段】
题目描述：

给你一个二进制字符串 s ，该字符串 不含前导零 。
如果s 包含 零个或一个由连续的 '1'组成的字段 ，返回 true​​​ 。否则，返回 false 。
如果 s 中 由连续若干个 '1' 组成的字段 数量不超过 1，返回 true​​​ 。否则，返回 false 。
/
示例 1：
输入：s = “1001”
输出：false
解释：由连续若干个 ‘1’ 组成的字段数量为 2，返回 false
/
示例 2：
输入：s = “110”
输出：true

解题思路：
根据题目的要求，我们可以首先将比较特别的情况给处理掉：
当二进制字符串s全部由’1‘或全部由’0‘组成，都满足要求，可以直接返回true。

接下来就是比较棘手的问题了，我们需要确定，字符串中包含一个由连续的 '1'组成的字段，这里面的难点就是，连续若干个 '1' 组成的字段 数量不可以超过 1。

为了得到二进制字符串s中，由连续若干个 '1' 组成的字段的数量，我们需要使用滑动窗口的思想，同时还需要获取字符串中字符’1‘的个数来充当辅助。

为什么要这么做呢…我们来讲述一下规律吧：

使用一个长度为2的滑动窗口来遍历字符串，当滑动窗口中的字符串为“11”的时候，就记录下来：
滑动窗口“11”出现的总数用pair表示；

我们还需要遍历字符串的每个字符，记录当中字符’1‘出现的次数：
二进制字符串中“1”的总数，用n来表示；

由连续若干个 ‘1’ 组成的字段的数量等于1时：n - pair = 1;
由连续若干个 ‘1’ 组成的字段的数量等于2时：n - pair = 2;
由连续若干个 ‘1’ 组成的字段的数量等于3时：n - pair = 3;
…
由连续若干个 ‘1’ 组成的字段的数量等于k时：n - pair = k;

遍历完二进制字符串 s , 只有n - pair = 1时，我们返回true。
————————————————
版权声明：本文为CSDN博主「.29.」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/ebb29bbe/article/details/127157457*/



class Solution {
    public boolean checkOnesSegment(String s) {
        //如果字符串中不出现‘1’或不出现‘0’，返回true
        //因为字符串包含 零个或一个由连续的 '1' 组成的字段
        //且由连续若干个 '1' 组成的字段 数量不超过 1
        if(!s.contains("1") || !s.contains("0")) return true;

        //获取二进制字段的长度
        int n = s.length();
        //记录由连续的 '1' 组成的字段 的数量
        int sum = 0;

        for(int i = 0;i < n;++i){  //遍历二进制字段
            char a = s.charAt(i);  
            if(a == '1')           //遍历到'1'
            ++sum;                 //记录其出现的次数
            if(i+1 < n){           //若长度为2的滑动窗口中是"11",
                if(a == '1' && s.charAt(i+1) == '1')
                --sum;             //记录-1
            }
        }
        //由连续若干个 '1' 组成的字段 数量为 1，返回true，否则返回false
        return sum == 1;          
        
    }
}









/*【14. 最长公共前缀】
题目描述：

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀，返回空字符串 “”。
示例 1：
输入：strs = [“flower”,“flow”,“flight”]
输出：“fl”
/
示例 2：
输入：strs = [“dog”,“racecar”,“car”]
输出：“”
解释：输入不存在公共前缀。

解题思路：
题目要求返回字符串数组中元素的最长公共前缀，那么我们可以将每一个字符串元素的相同位置字符进行比较：

全部相同则继续向后比较。
字符串相同位置的字符不等，返回最长公共前缀，即前面遍历过的字符串字符。
当某个字符串元素被完全遍历完，说明它就是最长公共前缀。

按照上述思路，问题就解决了。
————————————————
版权声明：本文为CSDN博主「.29.」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/ebb29bbe/article/details/127157457*/


class Solution {
    public String longestCommonPrefix(String[] strs) {
        int n = strs.length;   //获取字符串数组长度
        if(strs == null || n == 0) return "";//为空或没有元素，返回空字符串
 
        int count = strs[0].length();        //获取首字符串元素的长度

        for(int i = 0;i < count;++i){        //遍历字符串数组
            char c = strs[0].charAt(i);      //记录首字符串元素的各个字符
            for(int j = 1;j < n;++j){        //遍历各字符串元素相同位置的字符
            //当遇到不相同额字符 或 某个字符串元素被遍历完
                if(i == strs[j].length() || strs[j].charAt(i) != c)
                //返回当前长度的公共前缀
                    return strs[0].substring(0, i);        
            }
        }

        return strs[0];//如果元素长度为1，直接返回
    }
}






